package kylin.util;
import java.io.File;
import java.io.IOException;
import java.util.List;

import jxl.Workbook;
import jxl.format.Alignment;
import jxl.format.Border;
import jxl.format.BorderLineStyle;
import jxl.format.Colour;
import jxl.format.VerticalAlignment;
import jxl.write.Label;
import jxl.write.WritableCellFormat;
import jxl.write.WritableFont;
import jxl.write.WritableSheet;
import jxl.write.WritableWorkbook;
import jxl.write.WriteException;

import org.apache.log4j.Logger;

public class ExportExcel {

	Logger log = Logger.getLogger(ExportExcel.class);
	
	/**
	 * 单表 生成Excel
	 * @param title
	 * @param keys
	 * @param baseRul
	 * @param list
	 * @throws WriteException
	 * @throws IOException
	 */
	public void exportExcel(String title,String[] keys,String baseRul,List<List<Object>> list) throws WriteException,IOException{
		File file = new File(baseRul);
		
		//创建工作薄
		WritableWorkbook workBook = Workbook.createWorkbook(file);
		
		//创建工作单元
		WritableSheet sheet = workBook.createSheet(title, 0);
		
		//设置行高
		sheet.setRowView(0, 600);
		
		//设置列宽
		for(int i=0;i<keys.length;i++){
			sheet.setColumnView(i, 16);			
		}
		
		//构造表头
		sheet.mergeCells(0, 0, keys.length-1, 0);//起始列，行；终止列，行
		
		//设置字体参数
		WritableFont font = new WritableFont(WritableFont.ARIAL,18,WritableFont.BOLD);//参数说明，1.字体种类 2.字体大小 3.字体粗体
		
		//设置单元格样式
		WritableCellFormat titleFormat = new WritableCellFormat(font);
		
		//设置单元格水平方式（居右，居中，居左）
		titleFormat.setAlignment(Alignment.CENTRE);
		
		//设置单元格垂直方式（居上，居中，居下）
		titleFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
		
		//单元格标题内容
		Label titleLabel = new Label(0, 0, title, titleFormat);

		//添加内容
		sheet.addCell(titleLabel);
		
		//设置栏目样式
		WritableFont keyFont = new WritableFont(WritableFont.ARIAL);
		
		keyFont.setBoldStyle(WritableFont.BOLD);//加粗
		
		WritableCellFormat keyFormat = new WritableCellFormat(keyFont);
		
		//设置栏目背景颜色
		keyFormat.setBackground(Colour.GRAY_25);
		
		//设置栏目	
		for(int i=0;i<keys.length;i++){
			
			Label lb = new Label(i, 1, keys[i],keyFormat);
			
			sheet.addCell(lb);
		}
		
		//设置内容
		for(int n=0;n<list.size();n++){
			List<Object> listData = list.get(n);
			for(int m=0;m<listData.size();m++){
				
				Label lb = new Label(m, n+2, listData.get(m)+"");
				
				sheet.addCell(lb);
			}
		}
		
		//生成Excel文件
		workBook.write();
		
		//关闭输出流
		workBook.close();
		
		log.info("生成Excel成功！");
	}
	
	/**
	 * 主从表 生成Excel
	 * @param title
	 * @param keys
	 * @param keySon
	 * @param baseRul
	 * @param list
	 * @throws WriteException
	 * @throws IOException
	 */
	@SuppressWarnings("unchecked")
	public void exportDoubleExcel(String title,String[] keys,String[] keySon,String baseRul,List<List<Object>> list) throws WriteException,IOException{
		File file = new File(baseRul);
		
		//创建工作薄
		WritableWorkbook workBook = Workbook.createWorkbook(file);
		
		//创建工作单元
		WritableSheet sheet = workBook.createSheet(title, 0);
		
		//设置行高
		sheet.setRowView(0, 600);
		
		//设置列宽
		for(int i=0;i<keys.length;i++){
			sheet.setColumnView(i, 16);
		}
		
		//构造表头
		sheet.mergeCells(0, 0, keys.length-1, 0);//起始列，行；终止列，行
		
		//设置字体参数
		WritableFont font = new WritableFont(WritableFont.ARIAL,18,WritableFont.BOLD);//参数说明，1.字体种类 2.字体大小 3.字体粗体
		
		//设置单元格样式
		WritableCellFormat titleFormat = new WritableCellFormat(font);
		
		//设置单元格水平方式（居右，居中，居左）
		titleFormat.setAlignment(Alignment.CENTRE);
		
		//设置单元格垂直方式（居上，居中，居下）
		titleFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
		
		//单元格标题内容
		Label titleLabel = new Label(0, 0, title, titleFormat);

		//添加内容
		sheet.addCell(titleLabel);
		
		//设置栏目样式
		WritableFont keyFont = new WritableFont(WritableFont.ARIAL);
		
		keyFont.setBoldStyle(WritableFont.BOLD);//加粗
		
		WritableCellFormat keyFormat = new WritableCellFormat(keyFont);
		
		//设置栏目背景颜色
		keyFormat.setBackground(Colour.GRAY_25);
		
		//设置栏目	
		
		
		//设置内容
		int index = 1;
		for(int n=0;n<list.size();n++){
			List<Object> listData = list.get(n);
			
			Label lbTitle = null;
			for(int i=0;i<keys.length;i++){
				lbTitle = new Label(i, index, keys[i],keyFormat);
				sheet.addCell(lbTitle);
			}
			index += 1;
			
			List<Object> listS = null;
			for(int m=0;m<listData.size();m++){
				if(listData.size() == m+1){
					listS = (List<Object>)listData.get(m);
				}else{
					Label lb = new Label(m, index, listData.get(m)+"");
					sheet.addCell(lb);
					
				}
			}
			
			index += 1;
			//子集				
			if(listS != null){
				Label labTitle = null;
				for(int i=0;i<keySon.length;i++){
					labTitle = new Label(i+1, index, keySon[i],keyFormat);
					sheet.addCell(labTitle);
				}
				index += 1;
				for(int k=0;k<listS.size();k++){
					
					List<Object> listSon = (List<Object>)listS.get(k);
					for(int u=0;u<listSon.size();u++){
						Label lab = new Label(u+1, index, listSon.get(u)+"");
						sheet.addCell(lab);
					}	
					index += 1;
				}
				index += 1;
			}
			
		}
		
		//生成Excel文件
		workBook.write();
		
		//关闭输出流
		workBook.close();
		
		log.info("生成Excel成功！");
	}
	
	/**
	 * 生成安装费结算单
	 */
	public void createInstallBill(String title,String [] sonTitle,String keys[],double totalMoney,String baseUrl,List<List<List<Object>>> dataList,List<List<Object>> totalList) throws WriteException,IOException{
		
		File file = new File(baseUrl);
		
		//创建工作薄
		WritableWorkbook workBook = Workbook.createWorkbook(file);
		
		//创建工作单元
		WritableSheet sheet = workBook.createSheet(title, 0);
		
		//设置行高
		sheet.setRowView(0, 600);
		
		//设置列宽
		for(int i=0;i<keys.length;i++){
			sheet.setColumnView(i, 12);
		}
		
		/*****构造总标题样式 start****/
		//构造表头
		sheet.mergeCells(0, 0, keys.length-1, 0);//起始列，行；终止列，行
		
		//设置字体参数
		WritableFont font = new WritableFont(WritableFont.ARIAL,18,WritableFont.BOLD);//参数说明，1.字体种类 2.字体大小 3.字体粗体
		
		//设置单元格样式
		WritableCellFormat titleFormat = new WritableCellFormat(font);
		
		//设置单元格水平方式（居右，居中，居左）
		titleFormat.setAlignment(Alignment.CENTRE);
		
		//设置单元格垂直方式（居上，居中，居下）
		titleFormat.setVerticalAlignment(VerticalAlignment.CENTRE);
		
		//单元格标题内容
		Label titleLabel = new Label(0, 0, title, titleFormat);

		//设置边框
		titleFormat.setBorder(Border.ALL, BorderLineStyle.THIN);
		
		//添加内容
		sheet.addCell(titleLabel);
		
		/*****构造总标题样式 end****/
		
		/***********设置列头样式 start************/
		//设置栏目样式
		WritableFont keyFont = new WritableFont(WritableFont.ARIAL,11,WritableFont.BOLD);
		
		keyFont.setBoldStyle(WritableFont.BOLD);//加粗
		
		WritableCellFormat keyFormat = new WritableCellFormat(keyFont);
		
		//设置单元格水平方式（居右，居中，居左）
		keyFormat.setAlignment(Alignment.CENTRE);
		
		//设置栏目背景颜色
		keyFormat.setBackground(Colour.GRAY_25);
		
		//设置边框
		keyFormat.setBorder(Border.ALL, BorderLineStyle.THIN);
		
		/***********设置列头样式 start************/
		
		/************设置值样式 start************/
		WritableCellFormat valFormat = new WritableCellFormat();
		
		valFormat.setBorder(Border.ALL, BorderLineStyle.THIN);
		
		valFormat.setAlignment(Alignment.RIGHT);
		/************设置值样式 end************/
		
		/************设置加粗值样式 start************/
		WritableFont boldFont = new WritableFont(WritableFont.ARIAL,11,WritableFont.BOLD);
		
		boldFont.setBoldStyle(WritableFont.BOLD);//加粗
		
		WritableCellFormat boldFormat = new WritableCellFormat(boldFont);
		
		boldFormat.setBorder(Border.ALL, BorderLineStyle.THIN);
		
		//设置单元格水平方式（居右，居中，居左）
		boldFormat.setAlignment(Alignment.RIGHT);
		
		/************设置加粗值样式 end************/
		/**设置11号字 居中 加粗 start**/
		
		WritableCellFormat tFormat = new WritableCellFormat(boldFont);
		
		tFormat.setBorder(Border.ALL, BorderLineStyle.THIN);

		//设置单元格水平方式（居右，居中，居左）
		tFormat.setAlignment(Alignment.CENTRE);
		
		/**设置11号字 居中 加粗 end**/
		
		//设置内容
		int index = 1;//行号
		for(int n=0;n<dataList.size();n++){
			//子标题
			String stitle = sonTitle[n];//子标题
			sheet.mergeCells(0, index, keys.length-1, index);
			sheet.addCell(new Label(0, index, stitle, titleFormat));
			index++;
			//列头
			for(int m = 0;m<keys.length;m++){
				sheet.addCell(new Label(m, index, keys[m], keyFormat));
			}
			index++;
			//数据
			List<List<Object>> dlist = dataList.get(n);//获取数据集合
			for(int k=0;k<dlist.size();k++){
				List<Object> lst = dlist.get(k);//获取每行数据
				for (int u = 0; u < lst.size(); u++) {
					//if(u > 1 && u < 9){
						sheet.addCell(new Label(u, index, lst.get(u)+"",valFormat));
					//else
				}
				index ++;
			}
			
			//小计
			List<Object> tlst = totalList.get(n);//获取小计数据
			for (int p = 0; p < tlst.size(); p++) {
				sheet.addCell(new Label(p, index, tlst.get(p)+"",boldFormat));
			}
			index++;
		}
		//总计
		sheet.mergeCells(0, index, 3 , index);
		sheet.addCell(new Label(0, index, "总计：",boldFormat));
		sheet.mergeCells(4, index, 8 , index);
		sheet.addCell(new Label(4, index, totalMoney+"",tFormat));
		sheet.addCell(new Label(9, index, "",boldFormat));
		index++;
		//签字
		index++;
		sheet.addCell(new Label(7, index, "签字"));
		//生成Excel文件
		workBook.write();
		
		//关闭输出流
		workBook.close();
		
		log.info("生成Excel成功！");
	}
	
	
}
